package com.york.tinyrpc.protoss.serializer;

import com.york.tinyrpc.protoss.spi.SpiLoader;

/**
 * 序列化器工厂
 * 工厂+单例：序列化器可以复用，每次序列化执行的对象不需要重新创建
 * todo protoss版本：破除硬编码方式，读取配置文件，加载不同的序列化器（我们的系统自带了四种序列化器，用户可以选择加载这四种的任意以及自定义的序列化器）
 * todo已解决，使用SPI机制加载
 */
public class SerializerFactory {

    /**
     * 序列化器容器
     */
//    private static final Map<String, Serializer> SERIALIZERS = new HashMap<String, Serializer>();

    /**
     * 静态代码块赋值
     */
    static {
//        SERIALIZERS.put(TinyRpcConstants.JDK_SERIALIZER, new JdkSerializer());
//        SERIALIZERS.put(TinyRpcConstants.JSON_SERIALIZER, new JsonSerializer());
//        SERIALIZERS.put(TinyRpcConstants.HESSIAN_SERIALIZER, new HessianSerializer());
//        SERIALIZERS.put(TinyRpcConstants.KRYO_SERIALIZER, new KryoSerializer());
        // 使用SPI机制
        SpiLoader.load(Serializer.class);
    }

    /**
     * 提供默认的序列化器
     */
    private static final Serializer DEFAULT_SERIALIZER = new JdkSerializer();

    /**
     * 获取指定序列化器，提供默认
     */
    public static Serializer getSerializer(String serializerName) {
//        return SERIALIZERS.getOrDefault(serializerName, DEFAULT_SERIALIZER);
        return SpiLoader.getInstance(Serializer.class, serializerName);
    }
}
